<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="k7Ue7" id="k7Ue7"><span data-lake-id="u4891738e" id="u4891738e">典型回答</span></h1>
  <p data-lake-id="uf302dff5" id="uf302dff5"><br></p>
  <p data-lake-id="uf07184d1" id="uf07184d1"><span data-lake-id="u93201f97" id="u93201f97">char和varchar都是用于在数据库中存储字符串的数据类型。它们之间的主要区别在于存储空间的使用方式：</span></p>
  <p data-lake-id="ua603c14f" id="ua603c14f"><span data-lake-id="u7afb6be3" id="u7afb6be3">​</span><br></p>
  <p data-lake-id="u98ca83ba" id="u98ca83ba"><strong><span data-lake-id="u81c4701a" id="u81c4701a">char是一种定长的数据类型，它的长度固定且在存储时会自动在结尾添加空格来将字符串填满指定的长度</span></strong><span data-lake-id="u1ee4ead6" id="u1ee4ead6">。char的长度范围是0-255，</span></p>
  <p data-lake-id="u22dd4a21" id="u22dd4a21"><span data-lake-id="ub4e04e28" id="ub4e04e28">​</span><br></p>
  <p data-lake-id="u19c68e83" id="u19c68e83"><strong><span data-lake-id="u2a88d86a" id="u2a88d86a">varchar是一种可变长度的数据类型，它只会存储实际的字符串内容，不会填充空格</span></strong><span data-lake-id="ub1528e2b" id="ub1528e2b">。因此，在存储短字符串时，varchar可以节省空间。varchar的长度范围是0-65535（MySQL 5.0.3之后的版本）。</span></p>
  <p data-lake-id="u466bd2e4" id="u466bd2e4"><span data-lake-id="u3c1dd15d" id="u3c1dd15d">​</span><br></p>
  <p data-lake-id="u8348e298" id="u8348e298"><span data-lake-id="uc16dc125" id="uc16dc125">对于字段值经常改变的数据类型来说，CHAR 相比 VARCHAR 也更有优势，因为 CHAR 的长度固定，不会产生碎片。</span></p>
  <p data-lake-id="u2aa310f4" id="u2aa310f4"><span data-lake-id="ue24441b1" id="ue24441b1">​</span><br></p>
  <p data-lake-id="u374bed17" id="u374bed17"><span data-lake-id="u83abc186" id="u83abc186">如果使用char(100)，则插入记录后就分配了100个字节，后续修改不会造成页分裂的问题，而varchar(100)由于没有提前分配存储空间，因为表中数据刚开始插入时，可变长度字段值都是根据实际长度存储下来的，且行与行之间数据也是紧密连续存放在文件地址中的。那么现在值变长了，原来的位置无法扩展出新的空间出来，所以无法覆盖存放到原来的位置上。此时MySQL就会使用页分裂的方法扩展字段变长的空间。</span></p>
  <p data-lake-id="udd811cf1" id="udd811cf1"><br></p>
  <p data-lake-id="ucb2ef3b6" id="ucb2ef3b6"><strong><span data-lake-id="u35528aaa" id="u35528aaa">varchar的优点是</span></strong><span data-lake-id="u330c8fa3" id="u330c8fa3">变长的字符串类型，兼容性更好；但是同时也会带来一些问题，如使用varchar可能会产生内存碎片、varchar会额外需要1到2个字节存储长度信息、以及update语句可能会导致页分裂等。</span></p>
  <p data-lake-id="ua4b62e1a" id="ua4b62e1a"><span data-lake-id="u97d7ad4a" id="u97d7ad4a">​</span><br></p>
  <p data-lake-id="u4dd24adc" id="u4dd24adc"><strong><span data-lake-id="udea6b64b" id="udea6b64b">例如</span></strong><span data-lake-id="u4e0bc4a5" id="u4e0bc4a5">，存储产品描述（可变长度）、存储用户地址（可变长度）、存储用户名称（可变长度），这些都适合用varchar。</span></p>
  <p data-lake-id="u62a167b0" id="u62a167b0"><span data-lake-id="u0454971c" id="u0454971c">​</span><br></p>
  <p data-lake-id="udac8435d" id="udac8435d"><strong><span data-lake-id="u6bdd9231" id="u6bdd9231">char的优点是</span></strong><span data-lake-id="u264f9f88" id="u264f9f88">定长的字符串类型，减少内存碎片，并且无需额外的磁盘空间去存储长度信息。但是他的缺点是会删除列末尾的空格信息</span></p>
  <p data-lake-id="ue6d3e4e3" id="ue6d3e4e3"><span data-lake-id="u1f295858" id="u1f295858">​</span><br></p>
  <blockquote data-lake-id="ufa0fe523" id="ufa0fe523">
   <p data-lake-id="ucf21db03" id="ucf21db03"><span data-lake-id="u3ff1ca33" id="u3ff1ca33">char会在长度不足时，在后面补充空格，所以当我要在一个长度为10的char中，分别存一个</span><code data-lake-id="u236e46a2" id="u236e46a2"><span data-lake-id="ub903f1fb" id="ub903f1fb">"hollis "</span></code><span data-lake-id="u980dfa48" id="u980dfa48">和</span><code data-lake-id="u0f1cd036" id="u0f1cd036"><span data-lake-id="u021e466f" id="u021e466f">"hollis"</span></code><span data-lake-id="ud3882af5" id="ud3882af5">时，他存储的都是</span><code data-lake-id="u886a6bab" id="u886a6bab"><span data-lake-id="u2aeaf846" id="u2aeaf846">"hollis "</span></code><span data-lake-id="u51e9479c" id="u51e9479c">，所以会丢失原来存储的空格信息。</span></p>
  </blockquote>
  <p data-lake-id="u1f93e1ef" id="u1f93e1ef"><span data-lake-id="ucccb5fa0" id="ucccb5fa0">​</span><br></p>
  <p data-lake-id="u1289b6f5" id="u1289b6f5"><strong><span data-lake-id="uf8ad9559" id="uf8ad9559">例如</span></strong><span data-lake-id="ub96e1791" id="ub96e1791">，存储身份证号（固定长度）、存储订单号（固定长度）、存储国家编码（固定长度），这些都适合用char。</span></p>
  <p data-lake-id="u5a45ee54" id="u5a45ee54"><br></p>
 </body>
</html>